package com.crm.service.opportunityManager;

import com.crm.model.entity.opportunityManager.Opportunity;
import com.crm.model.entity.opportunityManager.OpportunityCollaborator;
import com.crm.model.qo.opportunityManager.OpportunityQO;
import com.crm.model.qo.opportunityManager.OpportunityStatusQO;
import com.crm.model.vo.customerManager.CustomerVO;
import com.crm.model.vo.datasearch.DataSearchResultVO;
import com.crm.model.vo.opportunityManager.*;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 商机管理信息
 */
public interface OpportunityDbService {


    /**
     * 商机管理  ----超级管理员
     * @param opportunityQO
     * @param sortOrder
     * @return
     */
    List<OpportunityVO> selectOpportunityGlyList(OpportunityQO opportunityQO, String sortOrder,Integer dateUnit);

    /**
     * 商机管理   ----分公司普通管理员
     * @param opportunityQO
     * @param sortOrder
     * @return
     */
    List<OpportunityVO> selectOpportunityFgsList(OpportunityQO opportunityQO, String sortOrder,Integer dateUnit);

    /**
     * 商机管理   ----普通用户
     * @param opportunityQO
     * @param sortOrder
     * @return
     */
    List<OpportunityVO> selectOpportunityPtyhList(OpportunityQO opportunityQO, String sortOrder,Integer dateUnit);

    /**
     * 商机管理-新增商机
     * @param opportunity
     * @return
     */
    Boolean addOpportunity(Opportunity opportunity);

    /**
     * 商机管理-删除商机-修改商机删除标记
     * @param opportunity
     * @return
     */
    Boolean updateOpportunityId(Opportunity opportunity);

    /**
     * 商机管理-查询商机信息
     * @param opportunityId
     * @return
     */
    Opportunity selectByOpportunityId(String opportunityId);

    /**
     * 修改回显
     * @param opportunityId
     * @return
     */
    OpportunityCustomerVO getOpportunityId(String opportunityId);

    /**
     * 修改客户管理的商机
     * @param opp
     * @return
     */
    Boolean updateOpportunity(Opportunity opp);

    /**
     * 根据联系人id查询商机
     * @param contactId 联系人id
     * @param toString 分组类型
     * @return
     */
    List<OpportunityVO> opportunityDetailList(String contactId, String toString);

    /**
     * 商机-商机详情-通过商机id查询
     * @param opportunityId 商机id
     * @return
     */
    OpportunityVO opportunityDetail(String opportunityId);

    /**
     * 根据客户id查询商机列表
     */
    List<Opportunity> selectOpportunityListByCustomerId(String customerId);

    /**
     * 商机状态统计
     * @param name 登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @param dateUnit  1本周 2本月 3本年
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityStatusVO> oppStatusStatistics(String name,Integer number, Integer dateUnit,String startTime,String endTime,String superAccountId);

    /**
     * 商机产品比重
     * @param name 登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @param dateUnit  1本周 2本月 3本年
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityProductVO> oppProductStatistics(String name,Integer number,Integer dateUnit,String superAccountId);

    /**
     * 管理模块 --商机分布--商机列表
     * @param name 登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @param dateUnit 1本周 2本月 3本年
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityStatisticsVO> selectOppStatistics(String name, Integer number, Integer dateUnit,String superAccountId);

    /**
     * 根据客户ID更新商机所有人ID、分公司ID
     * @Author pym
     * @Date  2021/4/8 15:23
     * @param customerId -客户ID
     * @param accountId -用户ID
     * @param companyId -公司ID
     * @param updatePeopleId -更新人ID
     * @param updateTm -更新时间
     * @return {@link {java.lang.Boolean}}
     */
    Boolean updateOpportunityByCustomerId(String customerId, String accountId, String companyId,
                                          String updatePeopleId, Date updateTm);

    /**
     * 通过商机id带出来合同需要的数据
     * @param opportunityId 商机id
     * @return
     */
    OpportunityContractDetailVO opportunityContractDetail(String opportunityId);

    /**
     * 管理员-商机状态统计
     * @param opportunityStatusQO dateType thisLastMonth 上月  thisMonth 本月 thisQuarter 本季度  thisYear 本年  section 区间
     * @param opportunityStatusQO startTime 起始时间
     * @param opportunityStatusQO endTime 截止时间
     * @return
     */
    List<OpportunityStatusVO> adminOppStatusStatistics(OpportunityStatusQO opportunityStatusQO);

    /**
     * 管理员-业绩排名
     * @param opportunityStatusQO dateType thisLastMonth 上月  thisMonth 本月 thisQuarter 本季度  thisYear 本年  section 区间
     * @param opportunityStatusQO startTime 起始时间
     * @param opportunityStatusQO endTime 截止时间
     * @return
     */
    List<PerformanceRankingVO> performanceRanking(OpportunityStatusQO opportunityStatusQO);

    /**
     * 查询成交额度
     * @param dateUnit  1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    BigDecimal selectTransactionAmount(int dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 查询会员新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    Integer selectNewMembers(int dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 商机新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    Integer selectNewOpportunity(int dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 查询赢单新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    Integer selectNewWinOrder(int dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 查询待回款额度
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    BigDecimal selectAmountReturned(int dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 查询联系人新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    Integer selectNewContact(int dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 查询电话量新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    Integer selectNewCallVolume(int dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 商机合同占比
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityProductVO> oppContractProportion(Integer dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 商机合同类型比例
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityProductVO> oppContractTypeProportion(Integer dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 商机成交额比例
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityProductVO> oppTurnoverProportion(Integer dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 商机拥有数排行
     * @param bs 1赢单排行  2总数排行
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityOfNumberVO> oppOfNumber(Integer bs,Integer number, String companyId,String superAccountId);

    /**
     * 商机状态个数跟进占比意向占比
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    List<OpportunityFollowIntentionZbVO> opportunityFollowIntentionZb(Integer dateUnit, Integer number, String companyId,String superAccountId);

    /**
     * 个人业绩下的商机分析数量
     * @param dateUnit 1本月 2本季度 3本年
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param accountId 用户id
     * @return
     */
    List<OpportunityStatusVO> oppStatusStatisticsAdmin(Integer dateUnit, String startTime, String endTime, String accountId);

    /**
     * 商机管理   ----协作人
     * @param opportunityQO
     * @param sortOrder
     * @param dateUnit
     * @return
     */
    List<OpportunityVO> selectOpportunityXzrList(OpportunityQO opportunityQO, String sortOrder, Integer dateUnit);

    /**
     * 查询自己的商机总条数
     * @param opportunityQO
     * @param dateUnit
     * @return
     */
    Integer selectOpportunityPtyhListCount(OpportunityQO opportunityQO, Integer dateUnit);

    /**
     * 查询自己协作的商机总条数
     * @param opportunityQO
     * @param dateUnit
     * @return
     */
    Integer selectOpportunityXzrListCount(OpportunityQO opportunityQO, Integer dateUnit);


    /**
     * @Description: 根据商机名称查询数据
     * @Param: [opportunityName]
     * @Return: java.util.List<com.crm.model.vo.datasearch.DataSearchResultVO>
     * @Author: lixq-f
     * @Date: 2021/5/13
     **/
    List<DataSearchResultVO> selectDataByOpportunityName(String opportunityName);
}
